#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "termino_merge.h"
#include "manejo_de_indices.h"

void print_test(char* name, bool resultado){

	printf("%s: %s\n", name, resultado? "OK" : "ERROR");

}

void generar_archivos_de_prueba_corta(){
	FILE* punteros_file = fopen("test.bin","wb");
	FILE* lexico_file = fopen("test_lex","w");
	
	fprintf(lexico_file,"comoholavas");
	
	unsigned long int puntero_test;
	
	puntero_test = 0;
	
	fwrite(&puntero_test,sizeof(unsigned long int),1,punteros_file);
	
	puntero_test = 4;
	
	
	fwrite(&puntero_test,sizeof(unsigned long int),1,punteros_file);
	
	puntero_test= 8;
	
	fwrite(&puntero_test,sizeof(unsigned long int),1,punteros_file);
	
	fclose(punteros_file);
	fclose(lexico_file);
	
}


void generar_archivos_de_prueba_media(){
	FILE* punteros_file = fopen("test.bin","wb");
	FILE* lexico_file = fopen("test_lex","w");
	
	fprintf(lexico_file,"aantecabeconcontradedesde");
	
	unsigned long int puntero_test;
	
	puntero_test = 0;
	
	fwrite(&puntero_test,sizeof(unsigned long int),1,punteros_file);
	
	puntero_test = 1;
	
	fwrite(&puntero_test,sizeof(unsigned long int),1,punteros_file);
	
	puntero_test= 5;
	
	fwrite(&puntero_test,sizeof(unsigned long int),1,punteros_file);
	
	puntero_test= 9;
	
	fwrite(&puntero_test,sizeof(unsigned long int),1,punteros_file);
	
	puntero_test= 12;
	
	fwrite(&puntero_test,sizeof(unsigned long int),1,punteros_file);
	
	puntero_test= 18;
	
	fwrite(&puntero_test,sizeof(unsigned long int),1,punteros_file);
	
	puntero_test= 20;
	
	fwrite(&puntero_test,sizeof(unsigned long int),1,punteros_file);
	
	
	
	fclose(punteros_file);
	fclose(lexico_file);
	
}



void prueba_longitud_terminos(){
	printf("\n------Pruebas obtener long terminos solo con punteros-------\n");
	generar_archivos_de_prueba_corta();

	FILE* punteros_file = fopen("test.bin","rb");

	FILE* lexico_file = fopen("test_lex","r");
	
	//ACT!!!
	unsigned long int primero;
	fread(&primero, sizeof(unsigned long int), 1, punteros_file);
	
	int largo = obtener_longitud_de_termino_en_archivo_lexico(primero,punteros_file,lexico_file);

	print_test("Prueba obtener long. de termino en archivo al inicio",largo==4);
	
	fseek(punteros_file,1*sizeof(unsigned long int),SEEK_SET);
	fread(&primero, sizeof(unsigned long int), 1, punteros_file);
	
	largo = obtener_longitud_de_termino_en_archivo_lexico(primero,punteros_file,lexico_file);

	print_test("Prueba obtener long. de termino en archivo en el medio",largo==4);
	
	fseek(punteros_file,2*sizeof(unsigned long int),SEEK_SET);
	fread(&primero, sizeof(unsigned long int), 1, punteros_file);
	
	largo = obtener_longitud_de_termino_en_archivo_lexico(primero,punteros_file,lexico_file);

	print_test("Prueba obtener long. de termino en archivo al final",largo==3);
	
	fclose(punteros_file);
	fclose(lexico_file);
	remove("test.bin");
	remove("test_lex");
	printf("\n");	
}




void prueba_bbin_archivo_corto(){
	generar_archivos_de_prueba_corta();
	
	FILE* punteros_file = fopen("test.bin","rb");
	

	FILE* lexico_file = fopen("test_lex","r");
	
	int largo_punteros;
	int long_reg = sizeof(unsigned long int);
	fseek(punteros_file,0,SEEK_END);
	largo_punteros = ftell(punteros_file);
	unsigned long int res = busqueda_binaria_en_archivo("vas",0,largo_punteros-long_reg,punteros_file,lexico_file);
	printf("%ld\n",res);
	print_test("Prueba buscar indice de termino en archivo corto 1",res==2);
	
	res = busqueda_binaria_en_archivo("hola",0,largo_punteros-long_reg,punteros_file,lexico_file);
	
	print_test("Prueba buscar indice de termino en archivo corto 2",res==1);
	
	res = busqueda_binaria_en_archivo("como",0,largo_punteros-long_reg,punteros_file,lexico_file);
	
	print_test("Prueba buscar indice de termino en archivo corto 3",res==0);
	
	fclose(punteros_file);
	fclose(lexico_file);
	remove("test.bin");
	remove("test_lex");
	printf("\n");
}

void prueba_bbin_archivo_medio(){
	
	generar_archivos_de_prueba_media();
	
	FILE* punteros_file = fopen("test.bin","rb");
	

	FILE* lexico_file = fopen("test_lex","r");
	
	int largo_punteros;
	int long_reg = sizeof(unsigned long int);
	fseek(punteros_file,0,SEEK_END);
	largo_punteros = ftell(punteros_file);
	unsigned long int res = busqueda_binaria_en_archivo("cabe",0,largo_punteros-long_reg,punteros_file,lexico_file);
	
	print_test("Prueba buscar indice de termino en archivo medio 1",res==2);
	
	res = busqueda_binaria_en_archivo("de",0,largo_punteros-long_reg,punteros_file,lexico_file);
	
	print_test("Prueba buscar indice de termino en archivo medio 2",res==5);
	
	res = busqueda_binaria_en_archivo("desde",0,largo_punteros-long_reg,punteros_file,lexico_file);
	
	print_test("Prueba buscar indice de termino en archivo medio 3",res==6);
	
	res = busqueda_binaria_en_archivo("dca",0,largo_punteros-long_reg,punteros_file,lexico_file);
	
	print_test("Prueba buscar indice de termino que no esta",res==-1);
	
	fclose(punteros_file);
	fclose(lexico_file);
	remove("test.bin");
	remove("test_lex");
	printf("\n");	
}


void prueba_bbin(){
	printf("\n------Pruebas busqueda binaria en indice-------\n");
	prueba_bbin_archivo_corto();
	prueba_bbin_archivo_medio();
}

int main(){
	prueba_longitud_terminos();
	prueba_bbin();
	
	char* ruta_punteros = "../programa-principal/indexer/term_index.bin";
	

	FILE* punteros_file = fopen(ruta_punteros,"rb");

	unsigned long int vector[3];
	
	fread(vector,sizeof(unsigned long int),3,punteros_file);

	printf("%ld\n",vector[0]);
	printf("%ld\n",vector[1]);
	printf("%ld\n",vector[2]);
	
	fclose(punteros_file);
	return 0;
}
